#include "BasicEnemy.h"
#include "../DeadlyShadowsLastHope/Player.h"
#include "../DeadlyShadowsLastHope/DestroyEntityMsg.h"
#include "../GameplayStates/GameplayState.h"
CBasicEnemy::CBasicEnemy(void)
{

}

CBasicEnemy::~CBasicEnemy(void)
{
	//		CDestroyEntityMsg* pMsg = new CDestroyEntityMsg(this);
	//	CMessageSystem::GetInstance()->SendMsg(pMsg);
	//	pMsg = nullptr;
}

//Inherited from CEntity///////////////////////////////
void CBasicEnemy::Update (float fElapsedTime)
{
	if( 0>=GetHealth())
	{
		m_pES->SendEvent("EDeath",CGameplayState::GetInstance());
		CDestroyEntityMsg* pMsg = new CDestroyEntityMsg(this);
		CMessageSystem::GetInstance()->SendMsg(pMsg);
		pMsg = nullptr;
	}

	CEntity::Update(fElapsedTime);
	m_pAM->Update(fElapsedTime,this->m_cAniInfo);
	//Get current animations
	//	this->SetHeight(m_pAM->GetCHeight(m_cAniInfo));
	//	this->SetWidth(m_pAM->GetCWidth(m_cAniInfo));
	if(this->GetPosY() + this->GetHeight() < CGame::GetInstance()->GetHeight() && this->OnPlatform() == false)
	{
		this->SetVelY(this->GetVelY()+5);
	}
	if(this->GetPosY() + this->GetHeight() > (int)CGame::GetInstance()->GetHeight())
	{
		this->SetPosY((float)CGame::GetInstance()->GetHeight()-this->GetHeight());
	}

	if(this->GetPosX() <= 0)
		if(this->GetVelX() < 0)
		{
			this->SetVelX(0);
			this->SetPosX(0);
		}

		if(this->GetPosX() + this->GetWidth() >= CGame::GetInstance()->GetWidth())
			if(this->GetVelX() > 0)
			{
				this->SetVelX(0);
				this->SetPosX((float)CGame::GetInstance()->GetWidth()-this->GetWidth());
			}

			if(this->m_pTarget->GetPosX() + m_pTarget->GetWidth() < this->GetPosX())
				this->SetVelX(-300);
			else if(this->m_pTarget->GetPosX() > this->GetPosX() + this->GetWidth())
				this->SetVelX(300);


			if(m_battack==false)
				m_fTimer+=fElapsedTime;
			if(m_fAttackTimer<=m_fTimer&&m_battack==false)
			{
				m_fTimer=0;
				m_battack=true;
			}

}

void CBasicEnemy::Render (void)
{

	this->m_pD3D->GetSprite()->Flush();
	RECT playerRect = {this->GetRect().left - CGameplayState::GetInstance()->GetCamera().camPosX, this->GetRect().top,
		this->GetRect().right - CGameplayState::GetInstance()->GetCamera().camPosX, this->GetRect().bottom};
	m_pD3D->DrawRect(playerRect, 0, 0, 255);
	m_pAM->Render(m_cAniInfo,playerRect.left-15,playerRect.top+3,1,this->GetFacing());
}

RECT CBasicEnemy::GetRect(void) const
{
	RECT rSelf = 
	{
		(LONG)GetPosX(),				(LONG)GetPosY(),
		(LONG)(GetPosX() + GetWidth()),	(LONG)(GetPosY() + GetHeight())
	};

	return rSelf;
}

bool CBasicEnemy::CheckCollision( IEntity* pOther )
{	
	if(CEntity::CheckCollision(pOther) == false)
		return false;
	RECT me = this->GetRect();
	RECT other = pOther->GetRect();
	RECT temp;
	IntersectRect(&temp, &me, &other);
	switch(pOther->GetType())
	{
	case OBJ_TILE:
		{
			if(this->GetPosY() <= other.bottom)
				this->SetVelY(this->GetVelY() + 5);
			if(this->GetPosY() >= other.top-3 )
			{
				if (temp.left !=0)
				{
					this->SetVelX(0);
					this->SetPosX((float)other.left-this->GetWidth());
				}

				if(/*temp.right !=0*/ me.left > other.left && me.left < other.right)
				{
					this->SetVelX(0);
					this->SetPosX((float)other.right);
				}
			}
			if(this->GetVelY() > 0)
			{
				if(temp.bottom !=0)
				{
					this->OnPlatform(true);

					if(this->GetVelY() > 0)
						this->SetVelY(0); 
				}
			}
		}
		break;
	case OBJ_PLAYER:
		{
			if(this->GetPosY() <= other.bottom)
				this->SetVelY(this->GetVelY() + 5);
			if(this->GetPosY() >= other.top-3 )
			{
				if (temp.left !=0)
				{
					if(m_battack==true)
					{
						m_pES->SendEvent("EAttacked",CGameplayState::GetInstance());
						m_cAniInfo.SetName("EBaseAttack");	
						m_cAniInfo.SetNext("EBaseWalk");
						m_cAniInfo.SetTime(0);
						m_cAniInfo.SetFrame(0);
					}
				}

				if(/*temp.right !=0*/ me.left > other.left && me.left < other.right)
				{
					if(m_battack==true)
					{
						m_pES->SendEvent("EAttacked",CGameplayState::GetInstance());
						m_cAniInfo.SetName("EBaseAttack");	
						m_cAniInfo.SetNext("EBaseWalk");
						m_cAniInfo.SetTime(0);
						m_cAniInfo.SetFrame(0);
					}
				}
			}
		}
		break;
	}
	return true;
}
///////////////////////////////////////////////////////

void CBasicEnemy::HandleEvent(CNEvent* pEvent)
{
	if(pEvent->GetEventID() == "take damage")
	{
		this->m_nHealth -= 35;
		SetHealth(m_nHealth);
		CPlayer* pPlayer = dynamic_cast<CPlayer*>(this->m_pTarget);
		pPlayer->SetCurrentHits(pPlayer->GetCurrentHits()+1);
		this->SetVelX(-(this->GetVelX()+10));
	}
	if(pEvent->GetEventID() == "take shield damage")
	{
		this->m_nHealth -= 50;
		SetHealth(m_nHealth);
		CPlayer* pPlayer = dynamic_cast<CPlayer*>(this->m_pTarget);
		pPlayer->SetCurrentHits(pPlayer->GetCurrentHits()+1);
		this->SetVelX(-(this->GetVelX()+10));
	}
	if(pEvent->GetEventID() == "Return")
	{
		CEventSystem* self = CEventSystem::GetInstance();
		self->SendEvent("TakePlayerDamage");
		m_cAniInfo.SetName("EBaseWalk");					//add this
		m_cAniInfo.SetNext("EBaseAttack");					//add this
		m_cAniInfo.SetTime(0);
		m_cAniInfo.SetFrame(0);
		m_battack=false;
	}
}

bool CBasicEnemy::Init(CEntity* pTarget,int x,int y,int speedset)
{
	if(pTarget->GetType() != OBJ_PLAYER)
		return false;
	else
	{
		m_pES = CEventSystem::GetInstance();
		m_pTM	= CSGD_TextureManager::GetInstance();
		m_pXA	= CSGD_XAudio2::GetInstance();
		m_pD3D	= CSGD_Direct3D::GetInstance();
		m_pMS	= CMessageSystem::GetInstance();
		m_pAM	= CAnimationManager::GetInstance();

		CEventSystem::GetInstance()->RegisterClient("take damage", this);
		CEventSystem::GetInstance()->RegisterClient("Return", this);
		CEventSystem::GetInstance()->RegisterClient("take shield damage", this);


		//Set planned animations
		this->m_cAniInfo.SetName("EBaseWalk");		 //Specific to class of enemy		//add this
		this->m_cAniInfo.SetNext("EBaseAttack");	 //Specific to class of enemy		//add this
		this->m_cAniInfo.SetTime(0);			 //Specific to class of enemy			//add this
		this->m_cAniInfo.SetFrame(0);			 //Specific to class of enemy			//add this

		//	this->SetHeight(m_pAM->GetCHeight(this->m_cAniInfo));
		//	this->SetWidth(m_pAM->GetCWidth(this->m_cAniInfo));
		this->SetHeight(32);															//add this
		this->SetWidth(32);																//add this
		this->SetFacing(true);															//add this
		this->SetDensity(1);															//add this

		this->SetPosX(float(x));

		this->SetPosY(float(y));//(float)CGame::GetInstance()->GetHeight() - this->GetHeight()-500);

		this->m_eType = OBJ_BASIC_ENEMY;
		this->SetVelX(0);
		this->SetVelY(0);
		this->m_pTarget = pTarget;														//add this
		this->m_nHealth = 100;
		this->SetHealth(100);
		this->m_nSpeedoffset =speedset;
		this->OnPlatform(false);

		this->m_fTimer =0;
		this->m_fAttackTimer =2.0f;
		this->m_battack=false;
	}
	return true;

}
